// 数组练习题解答示例 - 基础题部分

#include <stdio.h>
#include <stdlib.h>

// ========= 练习1：数组基本操作 =========

// 创建指定大小的数组
int* createArray(int size) {
    if (size <= 0) {
        printf("错误：数组大小必须大于0\n");
        return NULL;
    }
    
    int* arr = (int*)malloc(size * sizeof(int));
    if (arr == NULL) {
        printf("错误：内存分配失败\n");
        return NULL;
    }
    
    return arr;
}

// 初始化数组元素
void initArray(int* arr, int size, int initialValue) {
    if (arr == NULL || size <= 0) {
        return;
    }
    
    for (int i = 0; i < size; i++) {
        arr[i] = initialValue;
    }
}

// 根据下标访问元素（带边界检查）
int getElement(int* arr, int size, int index) {
    if (arr == NULL || index < 0 || index >= size) {
        printf("错误：索引越界或数组为空\n");
        return -1;  // 返回错误值
    }
    return arr[index];
}

// 修改指定位置的元素（带边界检查）
int setElement(int* arr, int size, int index, int value) {
    if (arr == NULL || index < 0 || index >= size) {
        printf("错误：索引越界或数组为空\n");
        return 0;  // 失败
    }
    
    arr[index] = value;
    return 1;  // 成功
}

// 打印整个数组
void printArray(int* arr, int size) {
    if (arr == NULL || size <= 0) {
        printf("数组为空或无效\n");
        return;
    }
    
    printf("数组内容: [");
    for (int i = 0; i < size; i++) {
        printf("%d", arr[i]);
        if (i < size - 1) {
            printf(", ");
        }
    }
    printf("]\n");
}

// ========= 练习2：数组元素查找 =========

// 在数组中查找指定值的元素
int findElement(int* arr, int size, int target) {
    if (arr == NULL || size <= 0) {
        return -1;
    }
    
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return i;  // 返回第一次出现的索引
        }
    }
    
    return -1;  // 未找到
}

// ========= 练习3：数组元素统计 =========

// 统计数组中的正数、负数、零的个数和平均值
void analyzeArray(int* arr, int size) {
    if (arr == NULL || size <= 0) {
        printf("数组为空或无效\n");
        return;
    }
    
    int positiveCount = 0;
    int negativeCount = 0;
    int zeroCount = 0;
    double sum = 0.0;
    
    for (int i = 0; i < size; i++) {
        sum += arr[i];
        if (arr[i] > 0) {
            positiveCount++;
        } else if (arr[i] < 0) {
            negativeCount++;
        } else {
            zeroCount++;
        }
    }
    
    printf("数组分析结果:\n");
    printf("正数个数: %d\n", positiveCount);
    printf("负数个数: %d\n", negativeCount);
    printf("零的个数: %d\n", zeroCount);
    printf("平均值: %.2f\n", sum / size);
}

// ========= 主函数：演示上述功能 =========

int main() {
    // 演示练习1
    printf("===== 练习1：数组基本操作 =====\n");
    int size = 5;
    int* arr = createArray(size);
    if (arr != NULL) {
        initArray(arr, size, 0);  // 初始化为0
        setElement(arr, size, 0, 10);
        setElement(arr, size, 1, 20);
        setElement(arr, size, 2, 30);
        setElement(arr, size, 3, 40);
        setElement(arr, size, 4, 50);
        
        printf("数组创建并初始化后:\n");
        printArray(arr, size);
        
        printf("索引2的元素值: %d\n", getElement(arr, size, 2));
        
        // 测试越界访问
        printf("尝试访问索引10的元素:\n");
        getElement(arr, size, 10);
    }
    
    // 演示练习2
    printf("\n===== 练习2：数组元素查找 =====\n");
    int target = 30;
    int index = findElement(arr, size, target);
    if (index != -1) {
        printf("元素 %d 在索引 %d 位置找到\n", target, index);
    } else {
        printf("元素 %d 未找到\n", target);
    }
    
    // 尝试查找不存在的元素
    target = 100;
    index = findElement(arr, size, target);
    if (index != -1) {
        printf("元素 %d 在索引 %d 位置找到\n", target, index);
    } else {
        printf("元素 %d 未找到\n", target);
    }
    
    // 演示练习3
    printf("\n===== 练习3：数组元素统计 =====\n");
    // 创建一个包含正数、负数和零的数组
    int statsArr[] = {5, -3, 0, 8, -1, 0, 7};
    int statsSize = sizeof(statsArr) / sizeof(statsArr[0]);
    printf("用于统计的数组: ");
    printArray(statsArr, statsSize);
    analyzeArray(statsArr, statsSize);
    
    // 释放内存
    if (arr != NULL) {
        free(arr);
    }
    
    return 0;
}